<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body><div class="cl-preview-section"><h1 id="【图解】flutter包大小优化的那些事">【图解】Flutter包大小优化的那些事</h1>
</div><div class="cl-preview-section"><ul>
<li>包大小分析</li>
<li>优化思路</li>
<li>APK优化实战</li>
</ul>
</div><div class="cl-preview-section"><blockquote>
<p>Flutter包大小优化需要用到集成打包的知识，对于还不了解如何打包Flutter应用的小伙伴可以先看我们课程后面有关集成打包部分的内容，然后再来学习本节课。</p>
</blockquote>
</div><div class="cl-preview-section"><h2 id="包大小分析">包大小分析</h2>
</div><div class="cl-preview-section"><p>将APK拖拽到AS中可以进行包大小分析：</p>
</div><div class="cl-preview-section"><p><img src="https://o.devio.org/images/fa/res/apk-size.png" alt="apk-size"></p>
</div><div class="cl-preview-section"><h2 id="优化思路">优化思路</h2>
</div><div class="cl-preview-section"><ul>
<li>图片优化</li>
<li>移除冗余的二三库</li>
<li>启用代码缩减和资源缩减</li>
<li>构建单ABI架构的包</li>
</ul>
</div><div class="cl-preview-section"><h3 id="图片优化">图片优化</h3>
</div><div class="cl-preview-section"><p>Flutter资源中占比较多的一般是图片，对于图片的优化常用的有两个方案：</p>
</div><div class="cl-preview-section"><ul>
<li>图片压缩：对于过大的图片可以使用<a href="https://tinypng.com/">https://tinypng.com/</a>进行压缩，使用压缩后的图片</li>
<li>使用网络图片：也可根据业务需要将本地图片改为网络图片；</li>
</ul>
</div><div class="cl-preview-section"><h3 id="移除冗余的二三库">移除冗余的二三库</h3>
</div><div class="cl-preview-section"><p>随着业务的增加，项目中会引入越来越多的二三方库，其中有不少是功能重复的，甚至是已经不再使用的。移除不再使用的和将相同功能的进行合并可以进一步较少包体积。</p>
</div><div class="cl-preview-section"><h3 id="启用代码缩减和缩减资源">启用代码缩减和缩减资源</h3>
</div><div class="cl-preview-section"><p>默认情况下压缩和缩减资源是开启的，启用代码缩减和缩减资源后构建出来的release包会减少10%左右的大小，甚至更多。</p>
</div><div class="cl-preview-section"><p>如果要代码缩减和缩减资源可以参考下如下设置：</p>
</div><div class="cl-preview-section"><pre><code>buildTypes {
    release {
        signingConfig signingConfigs.release
        minifyEnabled false
        shrinkResources false
    }
}
</code></pre>
</div><div class="cl-preview-section"><ul>
<li>minifyEnabled：是否启用代码缩减
<ul>
<li>如果将 minifyEnabled 属性设为 true，系统会默认启用 R8 代码缩减功能。代码缩减（也称为“摇树优化”）是指移除 R8 确定在运行时不需要的代码的过程。此过程可以大大减小应用的大小，例如，当您的应用包含许多库依赖项，但只使用它们的一小部分功能时。</li>
</ul>
</li>
<li>shrinkResources：是否启用缩减资源
<ul>
<li>资源缩减只有在与代码缩减配合使用时才能发挥作用。在代码缩减器移除所有不使用的代码后，资源缩减器便可确定应用仍要使用的资源。</li>
</ul>
</li>
</ul>
</div><div class="cl-preview-section"><h3 id="构建单abi架构的包">构建单ABI架构的包</h3>
</div><div class="cl-preview-section"><p>默认情况下通过AS或者<code>./gradlew assembleRelease</code> 构建出来的Release包是包含所有ABI架构的，通过分析一个为优化的Flutter应用包你会发现so是包体积是最大的一项：</p>
</div><div class="cl-preview-section"><p><img src="https://o.devio.org/images/fa/res/apk-size.png" alt="apk-size"></p>
</div><div class="cl-preview-section"><p>在这个案例中是使用了多ABI架构的安装包，其so的大小占整个包大小达到了83.5%，在<a href="https://class.imooc.com/sale/mobilearchitect">移动端架构师</a>课程中曾分析过<a href="https://class.imooc.com/sale/mobilearchitect">各ABI架构CPU的现状</a>：</p>
</div><div class="cl-preview-section"><div class="table-wrapper"><table>
<thead>
<tr>
<th>CPU</th>
<th>现状</th>
</tr>
</thead>
<tbody>
<tr>
<td>ARMv8</td>
<td>目前主流版本</td>
</tr>
<tr>
<td>ARMv7</td>
<td>一些老旧的手机</td>
</tr>
<tr>
<td>x86</td>
<td>从2011年起, 平板、模拟器用得比较多</td>
</tr>
<tr>
<td>x86_64</td>
<td>从2014年起, 64位的平板</td>
</tr>
</tbody>
</table>
</div></div><div class="cl-preview-section"><blockquote>
<p>目前手机市场上，x86 / x86_64/armeabi/mips / mips6的占有量应很少，arm64-v8a作为最新一代架构，是目前的主流，armeabi-v7a只存在少部分老旧手机。</p>
</blockquote>
</div><div class="cl-preview-section"><p>所以，为了进一步优化包大小我们可以构建出单一架构的安装包，在Flutter中我们可以通过以下方式来构建出单一架构的安装包：</p>
</div><div class="cl-preview-section"><pre><code>cd &lt;flutter应用的android目录&gt;
flutter build apk --split-per-abi
</code></pre>
</div><div class="cl-preview-section"><ul>
<li><code>flutter build</code>：命令默认会构建出release包</li>
<li><code>--split-per-abi</code>：表示构建单一架构</li>
</ul>
</div><div class="cl-preview-section"><p>运行次命令成功后会看打如下输入出：</p>
</div><div class="cl-preview-section"><pre><code>Removed unused resources: Binary resource data reduced from 518KB to 512KB: Removed 1%
Removed unused resources: Binary resource data reduced from 518KB to 512KB: Removed 1%
Removed unused resources: Binary resource data reduced from 518KB to 512KB: Removed 1%
Running Gradle task 'assembleRelease'...
Running Gradle task 'assembleRelease'... Done                      37.1s
✓ Built build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk (8.5MB).
</code></pre>
</div><div class="cl-preview-section"><p>从运行结果不难看出单一架构的安装包仅8.5MB，比多架构的安装包少了66%的体积。</p>
</div><div class="cl-preview-section"><blockquote>
<p>另外，如果想进一步压缩包体积可将so进行动态下发，感兴趣的小伙伴可以参考下<a href="https://class.imooc.com/sale/mobilearchitect">移动端架构师</a>中实现的<a href="https://class.imooc.com/sale/mobilearchitect">so动态加载方案</a>，将so放在远端进行动态加载，不仅能进一步减少包体积也可以实现代码的热修复和动态加载。</p>
</blockquote>
</div> <h1 style="color: red">认准一手，获取完整资料<br>QQ3195303913<br>微信wxywd8<br><br><br><br>高价回收正版课</h1></body></html>